#首先 import 必要的模块
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O

import matplotlib.pyplot as plt
import seaborn as sns

pd.set_option('display.max_columns',1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth',1000)
train = pd.read_csv("../res/data-csv/pima-indians-diabetes.csv")
print (train.head())
print("Train :", train.shape)
#查看数据基本信息
#total values in each column, null/not null, datatype, memory occupied etc
train.info()
#查看数值型特征的基本统计量
print("数值型特征的基本统计量:", train.describe())

# 从结果中我们可以看到很多列的最小值为0。而在一些特定列代表的变量中，0值并没有意义，这就表名该值无效或为缺失值。
# 具体来说，下列变量的最小值为0时数据无意义： 1、血浆葡萄糖浓度 2、舒张压 3、肱三头肌皮褶厚度 4、餐后血清胰岛素 5、体重指数
NaN_col_names = ['Plasma_glucose_concentration','blood_pressure','Triceps_skin_fold_thickness','serum_insulin','BMI']
print((train[NaN_col_names] == 0).sum())

sns.countplot(x="pregnants", hue="Target",data=train)
plt.show()


#数据相关性
data_corr = train.corr().abs()
plt.subplots(figsize=(15, 10))
sns.heatmap(data_corr,annot=True)
plt.show()

# for feature in train.columns:
#     sns.distplot(train[feature],kde = False)
#     plt.show()

#===================特征工程==========================

#从结果中我们可以看到很多列的最小值为0。而在一些特定列代表的变量中，0值并没有意义，这就表名该值无效或为缺失值。
# 具体来说，下列变量的最小值为0时数据无意义： 1、血浆葡萄糖浓度 2、舒张压 3、肱三头肌皮褶厚度 4、餐后血清胰岛素 5、体重指数
# 在Pandas的DataFrame中，通过replace()函数可以很方便的将我们感兴趣的数据子集的值标记为NaN。
# 标记完缺失值之后，可以利用isnull()函数将数据集中所有的NaN值标记为True，然后就可以得到每一列中缺失值的数量了。
NaN_col_names = ['Plasma_glucose_concentration','blood_pressure','Triceps_skin_fold_thickness','serum_insulin','BMI']
train[NaN_col_names] = train[NaN_col_names].replace(0, np.NaN)
print(train.isnull().sum())
medians = train.median()
train = train.fillna(medians)
print(train.isnull().sum())


#=====================数据标准化============
#  get labels
y_train = train['Target']
X_train = train.drop(["Target"], axis=1)

#用于保存特征工程之后的结果
feat_names = X_train.columns

# 数据标准化
from sklearn.preprocessing import StandardScaler

# 初始化特征的标准化器
ss_X = StandardScaler()

# 分别对训练和测试数据的特征进行标准化处理
X_train = ss_X.fit_transform(X_train)

#存为csv格式
X_train = pd.DataFrame(columns = feat_names, data = X_train)
train = pd.concat([X_train, y_train], axis = 1)
train.to_csv('FE_pima-indians-diabetes.csv',index = False,header=True)

print(train.head())